// Copyright (C) 2023 即时通讯网(52im.net) & Jack Jiang.
// The RainbowChat Project. All rights reserved.
// 
// 【本产品为著作权产品，合法授权后请放心使用，禁止外传！】
// 【本次授权给：<北京小羊驼科技有限公司>，授权编号：<NT231212144350>，代码指纹：<A.702363430.550>，技术对接人微信：<ID: wxid_wbyootvkdcgj22>】
// 【授权寄送：<收件：苏先生、地址：北京市大兴区北京密码西区6号楼1单元301、电话：18613885610、邮箱：bd@huiyuanxiang-inc.com>】
// 
// 【本系列产品在国家版权局的著作权登记信息如下】：
// 1）国家版权局登记名(简称)和权证号：RainbowChat    （证书号：软著登字第1220494号、登记号：2016SR041877）
// 2）国家版权局登记名(简称)和权证号：RainbowChat-Web（证书号：软著登字第3743440号、登记号：2019SR0322683）
// 3）国家版权局登记名(简称)和权证号：RainbowAV      （证书号：软著登字第2262004号、登记号：2017SR676720）
// 4）国家版权局登记名(简称)和权证号：MobileIMSDK-Web（证书号：软著登字第2262073号、登记号：2017SR676789）
// 5）国家版权局登记名(简称)和权证号：MobileIMSDK    （证书号：软著登字第1220581号、登记号：2016SR041964）
// * 著作权所有人：江顺/苏州网际时代信息科技有限公司
// 
// 【违法或违规使用投诉和举报方式】：
// 联系邮件：jack.jiang@52im.net
// 联系微信：hellojackjiang
// 联系QQ号：413980957
// 授权说明：http://www.52im.net/thread-1115-1-1.html
// 官方社区：http://www.52im.net
package com.x52im.rbchat.utils;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.Log;

import androidx.localbroadcastmanager.content.LocalBroadcastManager;

/**
 * RainbowChat的用户自定义广播通知实用类。
 *
 */
public class BroadcastToolKits
{
    private final static String TAG = BroadcastToolKits.class.getSimpleName();

//    /** 广播ACTION常量定义：重置群组头像缓存 */
//    private final static String BROADCAST_ACTION_RESETGROUPAVATARCACHE = "__bc_action_resetgroupavatarcache__";
    /** 广播ACTION常量定义："位置"消息中的预览截图保存完成时的广播通知 */
    private final static String BROADCAST_ACTION_LOCATION_MSG_PREVIEW_SAVED = "__bc_action_location_msg_preview_saved__";
    /** 广播ACTION常量定义：消息"撤回"功能中当收到撤回指令的应答时的广播通知 */
    private final static String BROADCAST_ACTION_REVOKE_CMD_RECIEVED = "__bc_action_revoke_cmd_recieved__";
    /** 广播ACTION常量定义：修改完成好友的备注后的广播通知 */
    private final static String BROADCAST_ACTION_FRIEND_REMARK_CHANGED = "__bc_action_friend_remark_changed__";
    /** 广播ACTION常量定义：收到群主修改群名称后的广播通知 */
    private final static String BROADCAST_ACTION_GROUP_NAME_CHANGED = "__bc_action_group_name_changed__";

    private static void doRegisterBroadcast(Context context, BroadcastReceiver br, String actionId) {
        try {
            if (br != null) {
                IntentFilter intentFilter = new IntentFilter();
                intentFilter.addAction(actionId);
                //注册本地接收器
                LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(context);
                localBroadcastManager.registerReceiver(br, intentFilter);
            }
        } catch (Exception e) {

        }
    }

    private static void doUnRegisterBroadcast(Context context, BroadcastReceiver br){
        try{
            if(br != null) {
                LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(context);
                localBroadcastManager.unregisterReceiver(br);
            }
        }
        catch (Exception e) {
            Log.w(TAG, e);
        }
    }

    private static void doSendBroadcast(Context context, Intent intent)
    {
        LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(context);
        //发送本地广播
        localBroadcastManager.sendBroadcast(intent);
    }

//    /**
//     * 注册广播：重置群组头像缓存.
//     * <p>
//     * 用于保证本地影响群头像生成的操作，能在其它UI界面中及时将群头像刷新为最新，因为删除群员
//     * 、邀请群员等操作会在服务端重新生成群头像，此广播就是以低耦合的方式实现本地聊头像UI刷新
//     * 的通知，如果没有此通知则因为其它UI界面中为了提高性能而已缓存了的老的群头像，将不会得到及
//     * 时更新，直到重启APP吧).
//     *
//     * @param context
//     * @param br
//     */
//    public static void resetGroupAvatarCache_REGISTER(Context context, BroadcastReceiver br)
//    {
//        doRegisterBroadcast(context, br, BROADCAST_ACTION_RESETGROUPAVATARCACHE);
//    }

//    /**
//     * 取消注册广播：重置群组头像缓存.
//     *
//     * @param context
//     * @param br
//     */
//    public static void resetGroupAvatarCache_UNREGISTER(Context context, BroadcastReceiver br)
//    {
//        doUnRegisterBroadcast(context, br);
//    }

//    /**
//     * 发送广播：重置群组头像缓存.
//     *
//     * @param context
//     * @param gid
//     */
//    public static void resetGroupAvatarCache_SEND(Context context, String gid)
//    {
//        Intent intent = new Intent(BROADCAST_ACTION_RESETGROUPAVATARCACHE);
//        intent.putExtra("gid", gid);
//        doSendBroadcast(context, intent);
//    }

    /**
     * 注册广播："位置"消息中的预览截图保存完成时的广播通知.
     * <p>
     * 由于高德地图的位置预览截图功能是由高德地图库内部完成，且是完全异步——不受开发者的程序控制，
     * 那么存在一个问题：即当位置消息指令已经发出时(只需很短的时间)，而此截图很可能还并保存完成
     * (尤其在一些低端机型上)，为了解决这个问题，就是在此图保存完成时发出一个广播，UI界面收到时
     * 强行刷新一次，就能弥补本地刚才未加载到此预览图的问题了.
     *
     * @param context
     * @param br
     */
    public static void locationMsgPreviewImgUploaded_REGISTER(Context context, BroadcastReceiver br)
    {
        doRegisterBroadcast(context, br, BROADCAST_ACTION_LOCATION_MSG_PREVIEW_SAVED);
    }

    /**
     * 取消注册广播："位置"消息中的预览截图保存完成时的广播通知.
     *
     * @param context
     * @param br
     */
    public static void locationMsgPreviewImgUploaded_UNREGISTER(Context context, BroadcastReceiver br)
    {
        doUnRegisterBroadcast(context, br);
    }

    /**
     * 发送广播："位置"消息中的预览截图保存完成时的广播通知.
     *
     * @param context
     * @param fileName
     */
    public static void locationMsgPreviewImgUploaded_SEND(Context context, String fileName)
    {
        Intent intent = new Intent(BROADCAST_ACTION_LOCATION_MSG_PREVIEW_SAVED);
        intent.putExtra("fname", fileName);
        doSendBroadcast(context, intent);
    }

    /**
     * 注册广播：消息"撤回"功能中当收到撤回指令的应答时的广播通知.
     * <p>
     * 由于消息"撤回"功能需要明确得到撤回指令是否被送达（通过MobileIMSDK的QoS机制确保），以便UI进行
     * 即时更新（比如像微信那样撤回时有进度提示，撤回完成后及时取消进度提示），本广播就是为了在收到指令
     * 应答后通过广播通知Ui层刷新（广播这种机制可以让后台数据与前端UI进行优雅解偶）。
     *
     * @param context
     * @param br
     */
    public static void revokeCMDRecieved_REGISTER(Context context, BroadcastReceiver br)
    {
        doRegisterBroadcast(context, br, BROADCAST_ACTION_REVOKE_CMD_RECIEVED);
    }

    /**
     * 取消注册广播：消息"撤回"功能中当收到撤回指令的应答时的广播通知.
     *
     * @param context
     * @param br
     */
    public static void revokeCMDRecieved_UNREGISTER(Context context, BroadcastReceiver br)
    {
        doUnRegisterBroadcast(context, br);
    }

    /**
     * 发送广播：消息"撤回"功能中当收到撤回指令的应答时的广播通知.
     *
     * @param context 上下文对象
     * @param fpForRevokeCMD "撤回"指令本身的指纹码
     * @param fpForRMessage "要撤回的消息自身的指纹码
     */
    public static void revokeCMDRecieved_SEND(Context context, String fpForRevokeCMD, String fpForRMessage)
    {
        Log.i(TAG, "【消息撤回】开始广播通知消息撤回成功执行完成了。(fpForRevokeCMD="+fpForRevokeCMD+"，fpForRMessage="+fpForRMessage+")");

        Intent intent = new Intent(BROADCAST_ACTION_REVOKE_CMD_RECIEVED);
        intent.putExtra("fp_for_revoke_cmd", fpForRevokeCMD);
        intent.putExtra("fp_for_message", fpForRMessage);
        doSendBroadcast(context, intent);
    }

    /**
     * 注册广播：修改完成好友的备注后的广播通知.
     * <p>
     * 好友备注修改完成后，app中的首页"消息"列表、好友列表、聊天界面都需要相应的更新ui显示，所以通过此通知来实现逻辑解偶。
     *
     * @param context
     * @param br
     */
    public static void friendRemarkChanged_REGISTER(Context context, BroadcastReceiver br)
    {
        doRegisterBroadcast(context, br, BROADCAST_ACTION_FRIEND_REMARK_CHANGED);
    }

    /**
     * 取消注册广播：修改完成好友的备注后的广播通知.
     *
     * @param context
     * @param br
     */
    public static void friendRemarkChanged_UNREGISTER(Context context, BroadcastReceiver br)
    {
        doUnRegisterBroadcast(context, br);
    }

    /**
     * 发送广播：修改完成好友的备注后的广播通知.
     *
     * @param context 上下文对象
     * @param friendUid 好友Uid
     * @param friendNicknameWithRemark 好友的备注（作为新的昵称）
     */
    public static void friendRemarkChanged_SEND(Context context, String friendUid, String friendNicknameWithRemark)
    {
        Log.i(TAG, "【好友备注更新】开始广播通知好友备注更新成功了。(friendUid="+friendUid+"，friendNicknameWithRemark="+friendNicknameWithRemark+")");

        Intent intent = new Intent(BROADCAST_ACTION_FRIEND_REMARK_CHANGED);
        intent.putExtra("friend_uid", friendUid);
        intent.putExtra("friend_nickname_with_remark", friendNicknameWithRemark);
        doSendBroadcast(context, intent);
    }

    /**
     * 注册广播：群名称被修改后的广播通知.
     * <p>
     * 群名称修改完成后，ui各处都需要相应的更新ui显示，所以通过此通知来实现逻辑解偶。
     *
     * @param context
     * @param br
     * @since 9.0
     */
    public static void groupNameChanged_REGISTER(Context context, BroadcastReceiver br)
    {
        doRegisterBroadcast(context, br, BROADCAST_ACTION_GROUP_NAME_CHANGED);
    }

    /**
     * 取消注册广播：群名称被修改后的广播通知.
     *
     * @param context
     * @param br
     * @since 9.0
     */
    public static void groupNameChanged_UNREGISTER(Context context, BroadcastReceiver br)
    {
        doUnRegisterBroadcast(context, br);
    }

    /**
     * 发送广播：群名称被修改后的广播通知.
     *
     * @param context 上下文对象
     * @param gid 群id
     * @param newGroupName 修改后的群名称
     * @since 9.0
     */
    public static void groupNameChanged_SEND(Context context, String gid, String newGroupName)
    {
        Log.i(TAG, "【群名称更新】开始广播通知群名称被修改了。(gid="+gid+"，newGroupName="+newGroupName+")");

        Intent intent = new Intent(BROADCAST_ACTION_GROUP_NAME_CHANGED);
        intent.putExtra("gid", gid);
        intent.putExtra("newGroupName", newGroupName);
        doSendBroadcast(context, intent);
    }
}
